package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.Aplinfo;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmEmpleado;
import org.apli.haiam.ejb.entidades.AdmInstitucion;
import org.apli.haiam.ejb.entidades.AdmMedico;
import org.apli.haiam.ejb.entidades.CexEspecialidad;
import org.apli.haiam.ejb.entidades.CexEspecialidadMedico;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad AdmMedico.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfMedico extends JsfBean<AdmMedico> {

    final Logger log = LoggerFactory.getLogger(JsfMedico.class);
    private String consultaUsername;
    public int cadulaInc = 0;
    private CexEspecialidad especialidad;
    private CexEspecialidad especialidadSecundaria;
    private CexEspecialidadMedico especialidadMedico;
    private List<CexEspecialidadMedico> listaEspecialidadMedico;
    private UsuarioAdmin user;

    /**
     * Constructor por defecto.
     */
    public JsfMedico() {
        // super();
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        object = new AdmMedico();
        object.setAmeEstado(1);
        cadulaInc = 0;
        especialidad = new CexEspecialidad();
        especialidadSecundaria = new CexEspecialidad();
        especialidadMedico = new CexEspecialidadMedico();
        listaEspecialidadMedico = new ArrayList<>();
        try {
            if (object.getAmeId() == null) {
                object.setAmeFechaIngreso(admin.getFechaDb());
            }
            user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
        } catch (Exception e) {
            log.error("obtene fecha() {} ", e.getMessage());

        }

    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        object.setAmeApellido(object.getAmeApellido().toUpperCase());
        object.setAmeNombre(object.getAmeNombre().toUpperCase());
        object.setAmeNombreFull(object.getAmeApellido().concat(" ").concat(object.getAmeNombre()));
        if (!listaEspecialidadMedico.isEmpty() || listaEspecialidadMedico.size() > 0) {
            if (cadulaInc == 1) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "cedula").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("msg.cedula.incorrecta"), bundle.getString("msg.cedula.incorrecta")));
            } else {
                if (object.getAmeId() == null) {

                    try {
                        if (!admin.existePorCampo(object.getClass(), "ameCedula", object.getAmeCedula())) {
                            object.setAdmInstitucion(user.getUser().getAdmEmpleado().getAdmInstitucion());
                            object.setAmeEstado(1);
                            admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                            for (CexEspecialidadMedico cexMedicoEspe : listaEspecialidadMedico) {
                                cexMedicoEspe.setAdmMedico(object);
                                adminObject.crear(cexMedicoEspe, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                            }
                            inicializar();
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                        } else {
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("msg.nombre.duplicado"), bundle.getString("msg.nombre.duplicado")));
                        }
                    } catch (Exception e) {
                        log.error("grabarAction() {} ", e.getMessage());
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    }
                } else {
                    try {
                        for (CexEspecialidadMedico cexMedicoEspe : listaEspecialidadMedico) {
                            if (cexMedicoEspe.getCesAmeId() != null) {
                                adminObject.modificar(cexMedicoEspe, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                            } else {
                                cexMedicoEspe.setAdmMedico(object);
                                adminObject.crear(cexMedicoEspe, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                            }

                        }
                        object.setCexEspecialidadMedicoList(listaEspecialidadMedico);
                        admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        inicializar();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                    } catch (Exception e) {
                        log.error("grabarAction() {} ", e.getMessage());
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    }
                }
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe agregar por lo menos una especialidad", "Debe agregar por lo menos una especialidad"));
        }

        cargarLista();
        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            lista = admin.listarOrdenada(object.getClass(), "ameNombreFull", true);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Agrega una especialidad al medico.
     */
    public void agregarEspecialidad() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        if (admin == null) {
            listaEspecialidadMedico = null;
            return;
        }
        try {
            int aux = 0;
            if (especialidadMedico.getCexEspecialidad() != null) {
                for (CexEspecialidadMedico cexEspMed : listaEspecialidadMedico) {
                    if (Objects.equals(cexEspMed.getCexEspecialidad().getCesId(), especialidadMedico.getCexEspecialidad().getCesId())) {
                        aux = 1;
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "subespecialidad").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Especialidad ya se encuentra agregada", "Especialidad ya se encuentra agregada"));
                    }
                }
                if (listaEspecialidadMedico.size() > 0) {
                    if (aux == 0) {
                        listaEspecialidadMedico.add(especialidadMedico);
                        //personalPat.setCexPatologia(new CexPatologia());
                        //personalPat.setPapObservacion("");
                        especialidadMedico = new CexEspecialidadMedico();
                    }
                } else {
                    listaEspecialidadMedico.add(especialidadMedico);
                    especialidadMedico = new CexEspecialidadMedico();
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "subespecialidad").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Subespecialidad campo requerido", "Subespecialidad campo requerido"));
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
        }
    }

    /**
     * Selecciona especialidad y elimina diagnostico consulta.
     *
     * @param item
     */
    public void eliminarEspecialidad(CexEspecialidadMedico item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (item.getCesAmeId() == null) {
                listaEspecialidadMedico.remove(item);
            } else {
                adminObject.eliminar(item, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                listaEspecialidadMedico.remove(item);
                //  FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "especialidad eliminada correctamente", "Debe agregar por lo menos una especialidad"));
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }

    }

    public void validarCedula() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (Aplinfo.isRucCedulaValido(object.getAmeCedula()) == false) {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "cedula").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", bundle.getString("msg.cedula.incorrecta")));
            cadulaInc = 1;
        } else {
            cadulaInc = 0;
        }
    }

    /**
     * Obtiene la lista de objetos en un DataModel.
     */
    @Override
    public void cargarDataModel() {
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
            List<AdmEmpleado> datos = admin.listarOrdenada(object.getClass(), "apellidos", true);
            List<SelectItem> items = new ArrayList<>();
            for (AdmEmpleado obj : datos) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemSubespecialidad() {
        try {
            List<CexEspecialidad> datos = admin.listarOrdenada(CexEspecialidad.class, "cexEspecialidad", especialidad, "cesEstado", 1, "cesNombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : datos) {
                items.add(new SelectItem(obj, obj.getCesNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemSubespecialidad() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemSubespecialidadSecundaria() {
        try {

            List<CexEspecialidad> datos = admin.listarOrdenada(CexEspecialidad.class, "cexEspecialidad", especialidadSecundaria, "cesEstado", 1, "cesNombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : datos) {
                items.add(new SelectItem(obj, obj.getCesNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemSubespecialidadSecundaria() {} ", e.getMessage());
        }
        return null;
    }

    @Override
    public String editarAction(AdmMedico obj) {
        try {
            //inicializar();
            object = obj;
            listaEspecialidadMedico.clear();
            listaEspecialidadMedico = adminObject.listarOrdenada(CexEspecialidadMedico.class, "admMedico", object, "cesAmeId", true);
        } catch (Exception e) {
            log.error("editarAction() {} ", e.getMessage());
        }
        return null;
    }

    public List<AdmMedico> medicoAutocompleteAction(String dato) {
        List<AdmMedico> result = new ArrayList<>();
        dato = dato.toUpperCase();
        try {
            result = admin.listarContiene(AdmMedico.class, "ameNombreFull", dato);
        } catch (Exception ex) {
            log.error("medicoAutocompleteAction(...) " + ex);
        }
        return result;
    }

    public CexEspecialidad getEspecialidad() {
        return especialidad;
    }

    public void setEspecialidad(CexEspecialidad especialidad) {
        this.especialidad = especialidad;
    }

    public String getConsultaUsername() {
        return consultaUsername;
    }

    public void setConsultaUsername(String consultaUsername) {
        this.consultaUsername = consultaUsername;
    }

    public void setEstado(boolean estado) {
        if (object != null) {
            object.setAmeEstado(estado ? 1 : 0);
        }
    }

    public boolean isEstado() {
        if (object != null && object.getAmeEstado() != null) {
            return object.getAmeEstado() == 1;
        }
        return false;
    }

    public void setEspecialidadSecundaria(CexEspecialidad especialidadSecundaria) {
        this.especialidadSecundaria = especialidadSecundaria;
    }

    public CexEspecialidadMedico getEspecialidadMedico() {
        return especialidadMedico;
    }

    public void setEspecialidadMedico(CexEspecialidadMedico especialidadMedico) {
        this.especialidadMedico = especialidadMedico;
    }

    public List<CexEspecialidadMedico> getListaEspecialidadMedico() {
        return listaEspecialidadMedico;
    }

    public void setListaEspecialidadMedico(List<CexEspecialidadMedico> listaEspecialidadMedico) {
        this.listaEspecialidadMedico = listaEspecialidadMedico;
    }
}
